#include <iostream>
#include <vector>
#include <list>

using namespace std;

//template<class Container>
//void Print(const Container& c)
//{
//	//typename Container::const_iterator it = c.begin();
//	auto it = c.begin();
//
//	while (it != c.end())
//	{
//		cout << *it << " ";
//		++it;
//	}
//	cout << endl;
//}  
//
//int main()
//{
//	vector<int> v;
//	v.push_back(1);
//	v.push_back(3);
//	v.push_back(2);
//	v.push_back(4);
//
//	Print(v);
//
//	return 0;
//}

//#define N 100
//
//// 静态栈
//template<class T>
//class Stack
//{
//private:
//	T _a[N];
//	int _top;
//};
// 


//template<class T, size_t N>
//class Stack
//{
//public:
//	void func()
//	{
//		// 常量，不能修改
//		N = 0;
//	}
//private:
//	T _a[N];
//	int _top;
//};
//
//
//int main()
//{
//	Stack<int, 10> st1; //假设需要10个数据
//	Stack<int, 100> st2; // 假设需要100个数据
//
//	return 0;
//}


#include <array>

//int main()
//{
//	array<int, 3> arr;
//	for (int e : arr)
//		cout << e << " ";
//	cout << endl;
//
//	arr[3];
//	
//	//int arr[3] = { 1,2,3 };
//	//arr[3];
//	return 0;
//}


//template<class T>
//bool Less(T x, T y)
//{
//	return x < y;
//}
//
////函数模板特化
//template<>
//bool Less<int*>(int* x, int* y)
//{
//	return *x < *y;
//}
//
//
//int main()
//{
//	cout << Less(1, 2) << endl;
//
//	int a = 20, b = 10;
//	
//	cout << Less(&a, &b) << endl;
//
//	return 0;
//}

template<class T1, class T2>
class Data
{
public:
	Data() { cout << "Data<T1, T2>" << endl; }
private:
	T1 _d1;
	T2 _d2;
};

// 假设我针对int double要进行特殊处理
// 全特化
template<>
class Data<int, double>
{
public:
	Data() { cout << "Data<int,double>" << endl; }
private:
};

// 偏特化 ： 特化部分参数
template<class T1>
class Data<T1, double>
{
public:
	Data() { cout << "Data<T1, double>" << endl; }
private:
};

// 偏特化 ： 可能是对某些类型的进一步限制
template<class T1, class T2>
class Data<T1*, T2*>
{
public:
	Data() { cout << "Data<T1*, T2*>" << endl; }
private:
};

template<class T1, class T2>
class Data<T1&, T2&>
{
public:
	Data() { cout << "Data<T1&, T2&>" << endl; }
private:
};

//int main()
//{
//	Data<int, int> d1;
//	Data<int, double> d2;
//	Data<int*, double> d3;
//	Data<double, double> d4;
//	Data<double*, double*> d5;
//	Data<void*, int*> d6;
//	Data<int&, double&> d7;
//
//	return 0;
//}


#include "Stack.h"

int main()
{
	xyx::stack<int> st;
	st.push(1);
	cout << st.top();
	st.pop();
	return 0;
}